home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / net_des.arc / UUDECODE.C < prev    next >
C/C++ Source or Header  |  1988-12-05  |  2KB  |  75 lines

  1. /* uudecode.c - convert ascii-encoded files back to their original form
  2.  * Usage: uudecode [infile]
  3.  *
  4.  * This command differs from the regular UNIX one in that the embedded
  5.  * file name "/dev/stdout" is recognized, allowing it to be used in a pipeline
  6.  *
  7.  * Written and placed in the public domain by Phil Karn, KA9Q 31 March 1987
  8.  */
  9. #include <stdio.h>
  10. #define    LINELEN    80
  11. #define    MAXREC    64
  12. main(argc,argv)
  13. int argc;
  14. char *argv[];
  15. {
  16.     char linebuf[LINELEN],*index(),*fgets();
  17.     register char *cp;
  18.     register int linelen,i;
  19.     FILE *in,*out;
  20.     
  21.     if(argc > 1){
  22.         if((in = fopen(argv[1],"r")) == NULL){
  23.             fprintf(stderr,"Can't read %s\n",argv[1]);
  24.             exit(1);
  25.         }
  26.     } else
  27.         in = stdin;
  28.  
  29.     /* Find begin line */
  30.     while(fgets(linebuf,LINELEN,in) != NULL){
  31.         if((cp = index(linebuf,'\n')) != NULL)
  32.             *cp = '\0';
  33.         if(strncmp(linebuf,"begin",5) == 0)
  34.             break;
  35.     }
  36.     if(feof(in)){
  37.         fprintf(stderr,"No begin found\n");
  38.         exit(1);
  39.     }
  40.     /* Find beginning of file name */
  41.     cp = &linebuf[6];
  42.     if((cp = index(cp,' ')) != NULL)
  43.         cp++;
  44.     /* Set up output stream */
  45.     if(cp == NULL || strcmp(cp,"/dev/stdout") == 0){
  46.         out = stdout;
  47.     } else if((out = fopen(cp,"w")) == NULL){
  48.             fprintf(stderr,"Can't open %s\n",cp);
  49.             exit(1);
  50.     }
  51.     /* Now crunch the input file */
  52.     while(fgets(linebuf,LINELEN,in) != NULL){
  53.         linelen = linebuf[0] - ' ';
  54.         /* Some uuencodes put ` (64) instead of space (0) in the
  55.          * end-of-file record
  56.          */
  57.         linelen &= 63;
  58.         if(linelen == 0 || strncmp(linebuf,"end",3) == 0)
  59.             break;
  60.         for(cp = &linebuf[1];linelen > 0;cp += 4){
  61.             for(i=0;i<4;i++){
  62.                 cp[i] -= ' ';
  63.                 cp[i] &= 63;
  64.             }
  65.             putc((cp[0] << 2) | ((cp[1] >> 4) & 0x3),out);
  66.             if(--linelen > 0)
  67.                 putc((cp[1] << 4) | ((cp[2] >> 2) & 0xf),out);
  68.             if(--linelen > 0)
  69.                 putc((cp[2] << 6) | cp[3],out);
  70.             linelen--;
  71.         }
  72.     }
  73.     fclose(out);
  74. }
  75.